{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-a34a30334354>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x') #插入一个待初始化的张量(Tensor)占位符\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\layers\\python\\layers\\layers.py:1624: flatten (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use keras.layers.flatten instead.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-11-413a88f1eb86>:3: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-12-3c77ec77605a>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.365369, the validation accuracy is 0.926\n",
      "after 200 training steps, the loss is 0.312976, the validation accuracy is 0.9546\n",
      "after 300 training steps, the loss is 0.285793, the validation accuracy is 0.9698\n",
      "after 400 training steps, the loss is 0.0886026, the validation accuracy is 0.9742\n",
      "after 500 training steps, the loss is 0.0401544, the validation accuracy is 0.9772\n",
      "after 600 training steps, the loss is 0.199452, the validation accuracy is 0.978\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.141838, the validation accuracy is 0.9564\n",
      "after 800 training steps, the loss is 0.0294375, the validation accuracy is 0.9828\n",
      "after 900 training steps, the loss is 0.0300572, the validation accuracy is 0.9854\n",
      "after 1000 training steps, the loss is 0.0662497, the validation accuracy is 0.987\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9835\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 心得体会"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 卷积的特性描述"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "整个卷积神经网络的流程为：输入层-（28*28的二维图像）--》第一层卷积层（6个5*5卷积核）--》第一层池化层（stride为2的最大池化）--》第二层卷积层（16\n",
    "个5*5的卷积核）--》第二层池化层（stride为2的最大池化）--》第三层全连接层--》输出层\n",
    "\n",
    "\n",
    "总结;前面的卷积层和池化层是为了提取输入的高级特征,送到全连接层的输入,然后训练出最后的结果."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 为什么卷积的效果要比全连接网络好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与传统神经网络相比，卷积神经网络有三大特色，分别是局部感知、权重共享和多卷积核这些都使得卷积的效果比全链接神经网络好。简述如下："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 局部感知"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "局部感知就是所说感受野，实际上就是卷积核和图像卷积的时候，每次卷积核所覆盖的像素只是一小部分，是局部特征，所以是局部感知，卷积神经网络\n",
    "是一个从局部到整体的过程，而传统神经网络是整体的过程。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 权值共享"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "传统神经网络参数量是非常巨大的，比如1000x1000像素的图片，映射到自己相同的大小，需要（1000x1000）的平方，也就是，10的12次方了，参数量太大了，\n",
    "而，卷积神经网络，除了卷积层的参数取决与滤波器的设置大小外（比如10x10的滤波器，也就只有100个参数），也就只有多卷积核，但与传统神经网络相比，参数量小，计算量小，整个图片共享一个\n",
    "滤波器的参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 多卷积核"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "一种卷积核代表的是一种特征，为获得更多不同的特征集合，卷积层会有多个卷积核，生成不同的特征，这也是为什么卷积后的图片的高每一个图片代表不同的特征。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
